/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.bo;

import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.dao.ValorIndicadorDAO;
import br.uniceub.fsw.indicadores.vo.ValorIndicadorVO;
import br.uniceub.fsw.indicadores.dao.IndicadorDAO;
import br.uniceub.fsw.indicadores.vo.IndicadorVO;
import java.util.List;
import java.util.Date;

/**
 * Business Object da entidade ValorIndicador. Essa classe é responsável por todos as
 * funcionalidades de negócio relacionadas à entidade.
 * 
 @author Marcos Mello Nobrega Soares ra2013617/8
 */
public class ValorIndicadorBO {

    ValorIndicadorDAO valorIndicadorDAO = new ValorIndicadorDAO();
    
    /**
     * Valida se o registro de valor de dado primário está pronto para inserção.
     * 
     * @param valorIndicador valor do indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o valor dado primário 
     * informado não possua condições de ser inserido no banco de dados.
     */
    public void validaValorIndicador(ValorIndicadorVO valorIndicador) throws Exception, NegocioException {
        
        String mensagem = new String();
        
        if(valorIndicador.getCdIndicador() == null || valorIndicador.getCdIndicador() == 0) {
            mensagem = mensagem.concat("Indicador relacionado não informado.<br />");
        }
        if(valorIndicador.getVlValorIndicador() == null) {
            mensagem = mensagem.concat("Valor do cálculo obrigatório.\n");
        }
        if(valorIndicador.getDtValorIndicador() == null) {
            mensagem = mensagem.concat("Data do cálculo obrigatória.<br />");
        }
        if(valorIndicador.getVlValorIndicador() != null && valorIndicador.getDtValorIndicador() != null) {
            try {  
                validarVOUnico(valorIndicador);
            }
            catch(NegocioException e) {
                mensagem = mensagem.concat(e.getMessage());
            }
            catch(Exception e) {
                throw new Exception(e.getMessage());
            }
        }
        
        if(!mensagem.isEmpty())
            throw new NegocioException(mensagem);
    }
    
    /**
     * Valida se já existe um registro de valor de dado primário no Banco de Dados para o dado e indicador como 
     * verificação para inserção.
     * 
     * @param valorIndicador valor dado primário a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o valor de dado primário 
     * informado para o dado primário e indicador já exista.
     */
    public void validarVOUnico(ValorIndicadorVO valorIndicador) throws Exception, NegocioException {
        
        if(valorIndicador.getVlValorIndicador() == null)
            throw new Exception("Valor do cálculo não foi informado.");
        
        if(valorIndicador.getDtValorIndicador() == null)
            throw new Exception("Data do cálculo não foi informada.");
        
        ValorIndicadorVO valorIndicadorExemplo = new ValorIndicadorVO();
        List<ValorIndicadorVO> lista;
        
        valorIndicadorExemplo.setVlValorIndicador(valorIndicador.getVlValorIndicador());
        valorIndicadorExemplo.setDtValorIndicador(valorIndicador.getDtValorIndicador());
        lista = valorIndicadorDAO.consultarPorExemplo(valorIndicadorExemplo);
        
        if(!lista.isEmpty())
             throw new NegocioException("Já existe um resultado de indicador para a data informada na base de dados.");
    }
    
    /**
     * Valida se o registro de valor de dado primário está pronto para inserção.
     * 
     * @param valorIndicador valor do indicador a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o valor dado primário 
     * informado não possua condições de ser inserido no banco de dados.
     */
    public void verificaLimites(ValorIndicadorVO valorIndicador) throws NegocioException {
        
        if (valorIndicador != null && valorIndicador.getVlValorIndicador() != null)
            if (valorIndicador.getVlValorIndicador() > valorIndicador.getIndicador().getVlLimiteControleSuperior()) 
                throw new NegocioException("Valor do indicador maior que o limite de controle superior");
            if (valorIndicador.getVlValorIndicador() < valorIndicador.getIndicador().getVlLimiteControleInferior())
                throw new NegocioException("Valor do indicador menor que o limite de controle inferior");
    }    
    
    /**
     * Executa o procedimento de cálculo do indicador. 
     * 
     * @param idIndicador 
     * @param manual indica que o cálculo é instantâneo e não deve ser persistido.
     * @throws java.lang.RuntimeException
     * @throws br.uniceub.fsw.arquitetura.servico.exception.NegocioException
     */
    public ValorIndicadorVO calculaIndicador(Integer idIndicador, boolean instantaneo) throws RuntimeException, NegocioException {
        IndicadorVO indicador = new IndicadorDAO().consultarPorId(idIndicador);
        
        if(indicador == null)
            throw new RuntimeException("ID de indicador não existe.");
        
        if(indicador.getNoProcedimentoCalculoIndicador().trim().equals(""))
            throw new RuntimeException("Indicador não possui procedimento de cálculo");
        
        if(!indicador.getStIndicadorAtivo().equals("S"))
            throw new NegocioException("Cálculo do indicador inativo não pode ser executado.");
        
        if(indicador.getStIndicadorManual().equals("S"))
            throw new NegocioException("Cálculo do indicador manual não pode ser executado.");
        
        if(indicador.getDtValidade() != null && indicador.getDtValidade().compareTo(new Date()) < 0)
            throw new NegocioException("Data de validade do indicador está vencida.");
        
        return valorIndicadorDAO.executaProcedimentoCalculoIndicador(indicador,instantaneo);
    }
}
